package com.free.ext.mybatis.dao;

import com.free.ext.mybatis.mapper.CustomMapper;
import com.free.ext.mybatis.model.entity.PageResponseModel;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.orderbyhelper.OrderByHelper;

import java.util.List;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class BaseDao<T, K> {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    @Autowired
    private CustomMapper<T> mapper;

    public CustomMapper<T> getMapper()
    {
        return mapper;
    }

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/
    public T select(K key)
    {
        return mapper.selectByPrimaryKey(key);
    }


    public T insert(T entity)
    {
        mapper.insertUseGeneratedKeys(entity);
        return entity;
    }

    public int insertDir(T entity){
        return mapper.insert(entity);
    }

    public int delete(K key)
    {
        return mapper.deleteByPrimaryKey(key);
    }

    public int deleteByCondition(T entity){return mapper.delete(entity);}

    public int update(T entity)
    {
        // 根据主键更新实体全部字段，null值会被更新
        //return mapper.updateByPrimaryKey(entity);
        // 根据主键更新属性不为null的值
        return mapper.updateByPrimaryKeySelective(entity);
    }


    public List<T> selectList(T cond, String orderBy)
    {
        if (StringUtils.isNotEmpty(orderBy))
        {
            OrderByHelper.orderBy(orderBy);
        }
        return mapper.select(cond);
    }


    public List<T> selectByExample(Object example)
    {
        return mapper.selectByExample(example);
    }


    public int selectCountByExample(Object example)
    {
        return mapper.selectCountByExample(example);
    }


    public int selectCount(T entity)
    {
        return mapper.selectCount(entity);
    }


    public T selectOne(T record)
    {
        return mapper.selectOne(record);
    }


    public PageResponseModel<T> selectByPageNo(T condition, String orderBy, int pageNo, int pageSize)
    {
        Page<T> lst = PageHelper.startPage(pageNo, pageSize);
        if (StringUtils.isNotEmpty(orderBy))
        {
            OrderByHelper.orderBy(orderBy);
        }
        mapper.select(condition);
        return new PageResponseModel<T>(lst);
    }
    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
